package com.xiashitech.agent.config;

import java.util.Iterator;
import java.util.Map;

public class EnvConfig {
    public static void configFromEnv() {
        Map map = System.getenv();
        Iterator it = map.entrySet().iterator();
        // 先设置默认值
        System.setProperty("otel.traces.exporter", "zipkin");
        System.setProperty("otel.metrics.exporter", "none");
        System.setProperty("otel.logs.exporter", "none");
        while(it.hasNext()) {
            Map.Entry entry = (Map.Entry)it.next();
            String key = (String) entry.getKey();
            if(!key.startsWith("HS_XS_AGENT_"))
                continue;
            String value = (String) entry.getValue();
            // 方式一，值中，分段
            // int pos = value.indexOf(":");
            // if(pos > 0) {
            //     String propertyKey = value.substring(0, pos);
            //     String propertyValue = value.substring(pos+1);
            //     System.setProperty(propertyKey, propertyValue);
            // }
            // 方式二，key 中，字符替换
            // String newKey = key.substring(12).replaceAll("___","~").replaceAll("__","-").replaceAll("_",".").replaceAll("~","_").toLowerCase();
            // System.setProperty(newKey, value);
            // 方式三 转义
            // 1）otel.metrics.exporter 用 xs.out.mexp 代替
            // 2）otel.traces.exporter 用 xs.out.texp 代替
            // 3）otel.logs.exporter 用 xs.out.lexp 代替
            // 4）otel.intrumentation.*.enabled 用 xs.intru.* 代替
            // 5）otel.javaagent.debug 用 xs.kenerl.debug 代替
            // 6）otel.exporter.zipkin.endpoint 用 xs.out.std.end 代替
            // 7）otel.service.name 用 xs.micro.inst.name 代替
            String newKey = key.substring(12);
            if("XS_OUT_MEXP".equalsIgnoreCase(newKey)) {
                System.setProperty("otel.metrics.exporter", value);
            } else if("XS_OUT_TEXP".equalsIgnoreCase(newKey)) {
                System.setProperty("otel.traces.exporter", value);
            } else if("XS_OUT_LEXP".equalsIgnoreCase(newKey)) {
                System.setProperty("otel.logs.exporter", value);
            } else if ("XS_MICRO_INSTRU_NAME".equalsIgnoreCase(newKey)) {
                System.setProperty("otel.service.name", value);
            } else if(newKey.startsWith("XS_INSTRU_")) {
                int pos = value.indexOf(":");
                if(pos < 1) {
                    System.out.println("环境编辑设置错误: " + key + ", " + value);
                }
                String propKey = value.substring(0, pos);
                String propValue = value.substring(pos+1);
                System.setProperty("otel.instrumentation."+propKey+".enabled", propValue);
            } else if("XS_KENERL_DEBUG".equalsIgnoreCase(newKey)) {
                System.setProperty("otel.javaagent.debug", value);
            } else if("XS_OUT_STD_END".equalsIgnoreCase(newKey)) {
                if(value.indexOf("/") > 0) {
                    System.setProperty("otel.exporter.zipkin.endpoint", value);
                } else if(value.indexOf(":") > 0) {
                    System.setProperty("otel.exporter.zipkin.endpoint", "http://" + value + "/api/v2/spans");
                } else {
                    System.setProperty("otel.exporter.zipkin.endpoint", "http://" + value + ":9411/api/v2/spans");
                }
            } else {
                System.setProperty(newKey.replaceAll("_",".").toLowerCase(), value);
            }
        }
    }
}
